package com.xiaolun;

/**
 * @Author 硕鼠
 * @Date 2020/5/7 22:06
 * @Version 1.0
 * @Description 文件说明
 */

/**
 * 总结：
 * 真实对象和代理对象都要实现同一个接口，代理对象要代理真实角色
 * 好处：代理对象可以做很多真实对象做不了的事情，真实对象专注做自己的事情。
 */
public class StaticProxy {
    public static void main(String[] args) {
        You you = new You(); //你要结婚
//        you.HappyMarry(); //不这样调用，使用（婚庆公司）代理方式调用，此时婚庆公司会做好多事before()。

        WeddingCompany weddingCompany = new WeddingCompany(you); //传入目标对象，我。（you 赋值给 Marry类型 target，可以吗？ ）
        weddingCompany.HappyMarry(); //通过代理调函数

//        new Thread(()-> System.out.println("我爱你")).start(); //lamda表达式，和下式对比，都是使用代理模式，类似。
//        new WeddingCompany(new You()).HappyMarry();

    }
}

interface Marry{
    void HappyMarry();
}

//真实角色，我去结婚
class You implements Marry{

    @Override
    public void HappyMarry() {
        System.out.println("我要结婚了，很开心-------");
    }
}

//代理角色，帮助你去结婚
class WeddingCompany implements Marry{

    //代理谁-> 真实目标角色-我
    private Marry target;

    public WeddingCompany(Marry target){
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry(); //这就是真实对象调用的一个结婚
        after();

    }

    private void before() {
        System.out.println("结婚之前，布置线程");
    }
    private void after() {
        System.out.println("结婚之后，收尾款");
    }


}